#include <stdio.h>

#define ATTR_1(arg) printf(#arg);
#define ATTR_2(arg, ...) ATTR_1(arg) ATTR_1(__VA_ARGS__)
#define ATTR_3(arg, ...) ATTR_1(arg) ATTR_2(__VA_ARGS__)
#define JOIN_1(a,b) a##b
#define JOIN(a,b)  JOIN_1(a,b)


#define comac_get_args_cnt(...) comac_arg_n(__VA_ARGS__)
#define comac_arg_n(_0, _1, _2, _3, _4, _5, _6, _7, N, ...) N
#define comac_arg_seqs() 7, 6, 5, 4, 3, 2, 1, 0
#define comac_argc(...) comac_get_args_cnt(0, __VA_ARGS__, comac_arg_seqs())

// repeat
#define repeat_0(fun, ...)
#define repeat_1(fun, ...) fun(1, __VA_ARGS__) repeat_0(fun, __VA_ARGS__)
#define repeat_2(fun, ...) fun(2, __VA_ARGS__) repeat_1(fun, __VA_ARGS__)
#define repeat_3(fun, ...) fun(3, __VA_ARGS__) repeat_2(fun, __VA_ARGS__)
#define repeat_4(fun, ...) fun(4, __VA_ARGS__) repeat_3(fun, __VA_ARGS__)
#define repeat_5(fun, ...) fun(5, __VA_ARGS__) repeat_4(fun, __VA_ARGS__)
#define repeat_6(fun, ...) fun(6, __VA_ARGS__) repeat_5(fun, __VA_ARGS__)
#define repeat_7(fun, ...) fun(7, __VA_ARGS__) repeat_6(fun, __VA_ARGS__)

#define repeat(n, fun, ...) repeat_##n(fun, ...)

#define ATTR(...) JOIN(ATTR_, comac_argc(__VA_ARGS__))(__VA_ARGS__)

int main(int argc, const char **argv) {
    printf("%d\n", comac_argc(1,2,3,4,5));
    ATTR("1\n","2\n","3\n")
    ATTR_3(1,2,3)
    while (1) {

    }
    return 0;
}
